import { check } from '@tauri-apps/plugin-updater';
import { isTauri } from './secure-storage';
import { Dialog } from 'quasar';

/**
 * 更新服务
 * 提供应用版本检测和更新功能
 */

export interface UpdateInfo {
  version: string;
  date?: string;
  body?: string;
}

/**
 * 检查更新
 * @param silent 是否静默检查（不显示对话框）
 * @returns 如果有更新返回 UpdateInfo，否则返回 null
 */
export async function checkForUpdates(silent: boolean = false): Promise<UpdateInfo | null> {
  if (!isTauri()) {
    console.log('非 Tauri 环境，跳过更新检查');
    return null;
  }

  try {
    const update = await check();

    if (update?.available) {
      const updateInfo: UpdateInfo = {
        version: update.version,
        date: update.date,
        body: update.body,
      };

      if (!silent) {
        showUpdateDialog(update, updateInfo);
      }

      return updateInfo;
    } else {
      if (!silent) {
        Dialog.create({
          title: '检查更新',
          message: '当前已是最新版本',
          ok: {
            label: '确定',
            color: 'primary',
          },
        });
      }
      console.log('当前已是最新版本');
      return null;
    }
  } catch (error) {
    console.error('检查更新失败:', error);
    if (!silent) {
      Dialog.create({
        title: '检查更新失败',
        message: error instanceof Error ? error.message : '无法连接到更新服务器',
        ok: {
          label: '确定',
          color: 'negative',
        },
      });
    }
    return null;
  }
}

/**
 * 显示更新对话框
 */
async function showUpdateDialog(update: any, updateInfo: UpdateInfo) {
  const message = `
发现新版本 ${updateInfo.version}${updateInfo.date ? ` (${updateInfo.date})` : ''}

${updateInfo.body || '本次更新包含性能优化和问题修复'}

是否立即更新？
  `.trim();

  Dialog.create({
    title: '发现新版本',
    message: message,
    html: true,
    ok: {
      label: '立即更新',
      color: 'primary',
      flat: false,
    },
    cancel: {
      label: '稍后提醒',
      color: 'grey',
      flat: true,
    },
    persistent: true,
  }).onOk(async () => {
    try {
      // 显示下载进度对话框
      const progressDialog = Dialog.create({
        title: '正在下载更新',
        message: '请稍候，正在下载更新包...',
        progress: true,
        persistent: true,
        ok: false,
        cancel: false,
      });

      try {
        // 下载并安装更新
        await update.downloadAndInstall();
        
        // 关闭进度对话框
        progressDialog.hide();

        // 提示安装完成，询问是否重启
        Dialog.create({
          title: '更新完成',
          message: '更新已下载完成，将在重启后生效。是否立即重启应用？',
          ok: {
            label: '立即重启',
            color: 'primary',
          },
          cancel: {
            label: '稍后重启',
            color: 'grey',
            flat: true,
          },
        }).onOk(async () => {
          try {
            // install() 会自动重启应用
            await update.install();
          } catch (error) {
            console.error('安装更新失败:', error);
            Dialog.create({
              title: '安装失败',
              message: error instanceof Error ? error.message : '安装更新时发生错误，请手动重启应用',
              ok: {
                label: '确定',
                color: 'primary',
              },
            });
          }
        });
      } catch (error) {
        progressDialog.hide();
        console.error('下载更新失败:', error);
        Dialog.create({
          title: '下载失败',
          message: error instanceof Error ? error.message : '无法下载更新',
          ok: {
            label: '确定',
            color: 'negative',
          },
        });
      }
    } catch (error) {
      console.error('更新过程出错:', error);
      Dialog.create({
        title: '更新失败',
        message: error instanceof Error ? error.message : '更新过程中发生错误',
        ok: {
          label: '确定',
          color: 'negative',
        },
      });
    }
  });
}

/**
 * 自动检查更新（应用启动时调用）
 * 静默检查，如果有更新则提示用户
 */
export async function autoCheckForUpdates(): Promise<void> {
  // 延迟检查，避免影响应用启动速度
  setTimeout(async () => {
    await checkForUpdates(true);
  }, 5000); // 5秒后检查
}

/**
 * 手动检查更新（用户触发）
 */
export async function manualCheckForUpdates(): Promise<void> {
  await checkForUpdates(false);
}

